class Store {
  constructor (options = {}) {
    // this.state = options.state// 目前不是响应式
    // store 上面应该有getters、mutations、actions、modules
    // console.log(this.Prototype.state)
    this.s = new Vue({
      data () {
        return {
          state: options.state
        }
      }
    })
    // 错误找到是data写成date了
    // console.log('s', this.state)// 目前这这个s中的data是没有值的
    // console.log('state', this.state) // 现在的state就是响应式了
    const getters = options.getters
    this.getters = {}
    // 劫持里面的每一个方法
    // 通过循环，拿出键值,绑定访问器属性get，劫持所有对象的属性
    Object.keys(getters).forEach((getterName) => {
      Object.defineProperty(this.getters, getterName, {
        // 这里不能这样用
        // get () {}
        get: () => {
          return this.state
          // return Store.prototype.state
        }
      })
    })
    const mutations = options.mutations
    this.mutations = {}
    // 订阅
    Object.keys(mutations).forEach((mutationsName) => {
      this.mutations[mutationsName] = (payload) => {
        mutations[mutationsName](this.state /* Store.prototype.state */, payload)
      }
    })
  }

  // 发布
  commit (mutationName, payload) {
    this.mutations[mutationName](payload)
  }

  // 定义一个方法取数据
  get state () {
    return this.s.state
  }
}
// vue => 是vue的构造函数
let Vue
// 第一步写一个install方法
const install = (_Vue) => {
  Vue = _Vue
  console.log('install')
  // 混入组件的生命周期
  Vue.mixin({
    beforeCreate () {
      console.log('beforeCreate')
      // 跟实例
      console.log(this)
      if (this.$options && this.$options.store) {
        // 挂载跟组件
        this.$store = this.$options.store
      } else {
        // 挂载子组件
        this.$store = this.$parent && this.$parent.$store
      }
    }
  })
}
export default {
  install, // 给用户提供一个接口，方便调用
  Store
}
